package context

import (
	"context"
	"go_admin/internal/consts"
	"go_admin/internal/database/system/model/dto"
	"go_admin/internal/service"

	"github.com/gogf/gf/v2/net/ghttp"
)

func init() {
	service.RegisterContext(New())
}

type sContext struct{}

func New() *sContext {
	return &sContext{}
}

func (s *sContext) Init(r *ghttp.Request, customCtx *dto.Context) {
	r.SetCtxVar(consts.CtxKey, customCtx)
}

func (s *sContext) GetUserId(ctx context.Context) uint64 {
	user := s.GetLoginUser(ctx)
	if user != nil {
		return user.Id
	}
	return 0
}

func (s *sContext) GetLoginUser(ctx context.Context) *dto.ContextUser {
	context := s.Get(ctx)
	if context == nil {
		return nil
	}
	return context.User
}

func (s *sContext) Get(ctx context.Context) *dto.Context {
	value := ctx.Value(consts.CtxKey)
	if value == nil {
		return nil
	}
	if localCtx, ok := value.(*dto.Context); ok {
		return localCtx
	}
	return nil
}
